package com.haohan.jingyuan.customer.dao;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.haohan.jingyuan.customer.entity.CustomerFile;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 客户材料Mapper接口
 * 
 * @ClassName CustomerFileMapper
 * @Description 客户材料数据访问层
 * @Author hexijun
 * @Time 2025/01/31 10:00
 * @Version 1.0
 */
@Mapper
public interface CustomerFileMapper extends BaseMapper<CustomerFile> {

    /**
     * 根据ID查询客户材料
     * 
     * @param id 主键ID
     * @return 客户材料
     */
    CustomerFile findById(@Param("id") Long id);

    /**
     * 根据文件key查询客户材料
     * 
     * @param fileKey 文件key
     * @return 客户材料
     */
    CustomerFile findByFileKey(@Param("fileKey") String fileKey);

    /**
     * 根据客户ID和文件key查询客户材料（查询未删除的记录，ukid=0）
     * 
     * @param customerId 客户ID
     * @param fileKey 文件key
     * @return 客户材料
     */
    CustomerFile findByCustomerIdAndFileKey(@Param("customerId") String customerId, @Param("fileKey") String fileKey);

    /**
     * 根据客户ID和文件key查询客户材料（查询未删除的记录，ukid=0），排除指定ID的记录
     * 
     * @param customerId 客户ID
     * @param fileKey 文件key
     * @param excludeId 排除的记录ID
     * @return 客户材料
     */
    CustomerFile findByCustomerIdAndFileKeyExcludeId(@Param("customerId") String customerId, @Param("fileKey") String fileKey, @Param("excludeId") Long excludeId);

    /**
     * 根据客户ID查询客户材料列表
     * 
     * @param customerId 客户ID
     * @return 客户材料列表
     */
    java.util.List<CustomerFile> selectByCustomerId(@Param("customerId") String customerId);

    /**
     * 根据文件key列表批量查询客户材料
     * 
     * @param fileKeys 文件key列表
     * @return 客户材料列表
     */
    java.util.List<CustomerFile> selectByFileKeys(@Param("fileKeys") java.util.List<String> fileKeys);

    /**
     * 分页查询客户材料列表
     * 
     * @param page 分页对象
     * @param customerId 客户ID（可空）
     * @param groupCode 分组code（可空）
     * @param tagCode 标签code（可空）
     * @return 分页客户材料列表
     */
    IPage<CustomerFile> selectFileListPage(Page<CustomerFile> page,
                                            @Param("customerId") String customerId,
                                            @Param("groupCode") String groupCode,
                                            @Param("tagCode") String tagCode);

    /**
     * 统计总文档数（未删除）
     *
     * @return 总文档数
     */
    Long countTotalFiles();

    /**
     * 根据月份和文件类型分组统计到期文件数量（近6个月）
     *
     * @param startMonth 开始月份（格式：yyyy-MM）
     * @param endMonth 结束月份（格式：yyyy-MM）
     * @return 分组统计结果列表，包含 month, fileType, fileCount
     */
    List<java.util.Map<String, Object>> groupByMonthAndFileType(@Param("startMonth") String startMonth,
                                                                 @Param("endMonth") String endMonth);
}

